class: center, middle, inverse, title-slide # Ayuda memoria [Datos] ## Curso: Análisis espacial, web-mapping y
aplicaciones web con R Shiny
### MSc. José A. Lastra ### Laboratorio Geo-Información y Percepción Remota ### 09/08/2021 --- background-image: url(data:image/png;base64,#logo_labgrs_color.png) background-position: center background-size:40% --- # R y RStudio -- - En este curso haremos uso del lenguaje de programación [R](https://www.r-project.org/) para todo lo que conlleva la lectura, manipulación y análisis de datos alfanuméricos y espaciales -- - Con el fin de disponer de una interfaz de trabajo amigable y más adecuada para el desarrollo haremos uso de [RStudio](https://www.rstudio.com/) *** .center[  ] *** --- Librerías utilizadas en esta sesión ```r library(tidyverse) #multiples herramientas de análisis, manipulación y visualización library(readxl) #carga de archivos excel ``` -- - Con estas librerías podremos leer, manipular, modificar y realizar análisis sobre matrices, vectores y data frames con información alfanumérica dentro de R. -- - Entender al menos las funciones básicas de lectura y manipulación de información es escencial para luego pasar de la codificación en R a la sintáxis de shiny. --- # Lectura de datos alfanuméricos -- - En R, podemos crear diferentes objetos y almacenar en ellos valores de distinto tipo (números, caracteres, matrices, etc.) -- - Estos valores pueden ser creados dentro de R o pueden ser leídos desde distintas fuentes de archivo. -- - A medida que vayamos avanzando, veremos las diferentes estructuras que puede tener un objeto en R considerando la fuente de datos que utilicemos y la función de lectura empleada. .center[ ] .center[ .footnote[© Allison Horst] ] --- # Lectura de archivos excel -- - Es importante siempre tener la noción de donde estaremos trabajando, para esto se puede crear un proyecto y asignarlo a un directorio con nuestros datos *(File/New Project)* o emplear la función *setwd()* para indicar en el script nuestro directorio de lectura y guardado. -- ```r setwd('C:/Carpeta') #ruta de trabajo ``` -- ```r ## Leer archivo CTD <- read_excel("Araucania2018_CTD_C1.xls") ``` -- - Otras funciones de lectura son: + read.csv(base R) ó read_csv(tidyverse) + readRDS(base R) + read.table(base R) *** Cada una de las funciones de lectura, dependerá de la naturaleza de la información a trabajar. -- - *Importante*: siempre debe revisar el directorio de trabajo donde se encuentra y asegurarse de que el archivo esté en ese directorio. ---
--- # Revisando la estructura -- - Un aspecto importante es poder ver algunas características de nuestra información, para lo cual disponemos de algunas funciones como: -- - Para revisar primeros registros ```r head(CTD) ``` ``` ## # A tibble: 6 x 9 ## Transecto Estaciones Código crucero `Profundidad (m)` `Temperatura (°C)` ## <chr> <chr> <chr> <dbl> <dbl> <dbl> ## 1 2 millas Nehuentué2 MPAT1-2 1 1.75 15.6 ## 2 2 millas Nehuentué2 MPAT1-2 1 2 15.6 ## 3 2 millas Nehuentué2 MPAT1-2 1 2.25 15.6 ## 4 2 millas Nehuentué2 MPAT1-2 1 2.5 15.6 ## 5 2 millas Nehuentué2 MPAT1-2 1 2.75 15.5 ## 6 2 millas Nehuentué2 MPAT1-2 1 3 15.5 ## # ... with 3 more variables: Sigma T (Kg/m3) <dbl>, Salinidad (UPS) <dbl>, ## # Oxigeno (ml/L) <dbl> ``` --- - Para revisar los últimos ```r tail(CTD) ``` ``` ## # A tibble: 6 x 9 ## Transecto Estaciones Código crucero `Profundidad (m)` `Temperatura (°C)` ## <chr> <chr> <chr> <dbl> <dbl> <dbl> ## 1 10 millas Queule10 MPAT3-10 1 29.8 9.65 ## 2 10 millas Queule10 MPAT3-10 1 30 9.64 ## 3 10 millas Queule10 MPAT3-10 1 30.2 9.64 ## 4 10 millas Queule10 MPAT3-10 1 30.5 9.64 ## 5 10 millas Queule10 MPAT3-10 1 30.8 9.63 ## 6 10 millas Queule10 MPAT3-10 1 31 9.63 ## # ... with 3 more variables: Sigma T (Kg/m3) <dbl>, Salinidad (UPS) <dbl>, ## # Oxigeno (ml/L) <dbl> ``` --- - Podemos revisar la clase de objeto ```r class(CTD) ``` ``` ## [1] "tbl_df" "tbl" "data.frame" ``` --- - La estructura ```r str(CTD) ``` ``` ## tibble [994 x 9] (S3: tbl_df/tbl/data.frame) ## $ Transecto : chr [1:994] "2 millas" "2 millas" "2 millas" "2 millas" ... ## $ Estaciones : chr [1:994] "Nehuentué2" "Nehuentué2" "Nehuentué2" "Nehuentué2" ... ## $ Código : chr [1:994] "MPAT1-2" "MPAT1-2" "MPAT1-2" "MPAT1-2" ... ## $ crucero : num [1:994] 1 1 1 1 1 1 1 1 1 1 ... ## $ Profundidad (m) : num [1:994] 1.75 2 2.25 2.5 2.75 3 3.25 3.5 3.75 4 ... ## $ Temperatura (°C): num [1:994] 15.6 15.6 15.6 15.6 15.5 ... ## $ Sigma T (Kg/m3) : num [1:994] 24.5 24.5 24.5 24.5 24.5 ... ## $ Salinidad (UPS) : num [1:994] 33.3 33.3 33.3 33.3 33.3 ... ## $ Oxigeno (ml/L) : num [1:994] 6.78 6.76 6.74 6.73 6.73 ... ``` --- # Uso de funciones -- - En R muchas veces emplearemos diferentes funciones sobre un mismo objeto. -- - Por esto es importante entender el concepto de anidar funciones y como R las lee. -- - En una forma convencional R lee el código desde dentro hacia afuera, como se puede ver en este ejemplo: ```r ## creando números aleatorios y calculando el mínimo min(rnorm(n = 100,mean = 10,sd = 4)) ``` ``` ## [1] 2.313222 ``` -- - Lo primero en ejecutarse es la función *rnorm()* y luego la función *min()* --- - Al usar *tidyverse* podemos valernos de `%>%` para usar funciones consecutivas y leer de izquierda a derecha. -- - Esto es útil porque hace que nuestro código en general sea más ordenado y encontrar errores también sea más simple. -- - Además de incorporar las funciones de otras librerías como ggplot2, dplyr, tidyr entre otras -- - Mismo ejemplo: ```r rnorm(n = 100, mean = 10, sd = 4) %>% min() ``` ``` ## [1] -0.6121396 ``` -- - *El resultado no es el mismo porque usamos números aleatorios sin configurar una semilla con la función `set.seed()`* --- # Seleccionando datos dentro de nuestro data frame -- # Columnas - Seleccionar datos puede ser bastante flexible y dependerá de lo que nos resulte más cómodo o más eficiente. -- ```r #Forma 1 CTD.sub <- CTD[,6:9] %>% as.data.frame() #esto es lo mismo CTD.sub <- as.data.frame(CTD[,6:9]) ```
--- -- - Aquí podemos crear un objeto con las columnas de interés y luego usarlo para seleccionarlas en nuestra tabla. ```r #Forma 2 columnas <- colnames(CTD)[6:9] #creando objeto para seleccionar columnas CTD.sub <- CTD[,columnas] %>% as.data.frame() #esto es lo mismo CTD.sub <- as.data.frame(CTD[,columnas]) ``` --
--- -- - Aquí se emplea una función de la librería *dplyr*, que se carga cuando empleamos *tidyverse* y nos permite usar otras herramientas de manipulación de datos. ```r #Forma 3 CTD.sub <- CTD %>% dplyr::select(`Temperatura (°C)`, `Sigma T (Kg/m3)`, `Salinidad (UPS)`,`Oxigeno (ml/L)`) #esto es lo mismo CTD.sub <- dplyr::select(CTD, `Temperatura (°C)`, `Sigma T (Kg/m3)`, `Salinidad (UPS)`,`Oxigeno (ml/L)`) ``` --
--- # Filas -- -La selección de filas también puede ser realizada de varias maneras -- ```r ##seleccionando 50 registros CTD_50 <- CTD[1:50,] ```
--- -- ```r ##seleccionando registros según condiciones CTD_nehuentue2 <- CTD %>% filter(Estaciones=='Nehuentué2') #esto es lo mismo CTD_nehuentue2 <- filter(CTD, Estaciones=='Nehuentué2') ``` --
--- #¿Y si quiero las estaciones a 2, 5 y 10 millas? -- - Podemos emplear diferentes formas de establecer valores para filtrar nuestra información -- - Lo importante es asegurarse que el valor esté dentro de la tabla (si es numérico) o escribirlo igual a como aparece en la tabla (si es caracter) -- - En este ejemplo se usa la función *unique()* para identificar los elementos únicos dentro de la coumna *Estaciones* y se seleccionan los primeros tres empleando los *[ ]* -- ```r #solo para ver resultado unique(CTD$Estaciones)[1:3] ``` ``` ## [1] "Nehuentué2" "Nehuentué5" "Nehuentué10" ``` --- -- ```r ##seleccionando registros estaciones <- unique(CTD$Estaciones)[1:3] #creando objeto con valores de interes CTD_nehuentue <- CTD %>% filter(Estaciones %in% estaciones) #esto es lo mismo CTD_nehuentue <- filter(CTD, Estaciones %in% estaciones) ``` --
--- # Resúmenes de información -- - Además de las cosas que podemos calcular de forma directa empleando las funciones de base de R, también podemos realizar resúmenes estadísticos empleando algunas funciones de las librerías que se cargan al agregar *tidyverse* a nuestro entorno de trabajo. -- - Un flujo normal para obtener el promedio de temperatura por estación sería algo como lo siguiente: -- ```r lat <- filter(CTD, Estaciones == 'Nehuentué2') mean(lat$`Temperatura (°C)`, na.rm = T) ``` ``` ## [1] 12.08396 ``` *** -- - El *“problema”* de esta aproximación es que si tenemos muchas latitudes (estaciones, zonas, cuadrantes, etc.) tendremos que repetir este procedimiento o deberemos armar un ciclo de programación que nos entregue el reporte, de una forma más eficiente --- -- - Una alternativa para esto y muchos otros casos, puede ser el siguiente ejemplo que emplea funciones de *dplyr* (importado con *tidyverse*): ```r #función nos entrega número de datos por estaciones CTD %>% group_by(Estaciones) %>% summarise(mean_temp = mean(`Temperatura (°C)`, na.rm=T)) ```
--- -- ```r CTD %>% group_by(Estaciones) %>% summarise(mean_temp = mean(`Temperatura (°C)`),mean_psu = mean(`Salinidad (UPS)`), mean_dens = mean(`Sigma T (Kg/m3)`),mean_ox = mean(`Oxigeno (ml/L)`), n_datos = n()) ```
--- #Graficando en R -- - En R podemos realizar todo tipo de análisis y además podemos obtener resultados gráficos de los mismos y de los datos de origen. -- - La función base de R para realizar gráficos es *plot()* y dispone de diferentes parámetros configurables [[Más detalles.](https://www.statmethods.net/advgraphs/parameters.html)] -- - Un ejemplo ```r ctd_filter <- CTD %>% filter(Estaciones == 'Nehuentué2') #filtrando #Graficando plot(ctd_filter$`Temperatura (°C)`,ctd_filter$`Profundidad (m)`*-1, type = 'l', xlab='Temperatura',ylab = 'Profundidad', main='Perfil de temperatura Nehuentué 2 millas') ``` --- <img src="data:image/png;base64,#01_Repaso_files/figure-html/unnamed-chunk-30-1.png" width="252" style="display: block; margin: auto;" /> --- -- - También podemos construir otro tipo de gráficos como boxplot o histogramas con las funciones base -- ```r #histograma hist(ctd_filter$`Temperatura (°C)`, xlab='Temperatura', main='Histograma de temperatura Nehuentué 2 millas') ``` <img src="data:image/png;base64,#01_Repaso_files/figure-html/unnamed-chunk-31-1.png" width="432" style="display: block; margin: auto;" /> --- ```r #histograma boxplot(ctd_filter$`Temperatura (°C)`, ylab='Temperatura', main='Histograma de temperatura Nehuentué 2 millas') ``` <img src="data:image/png;base64,#01_Repaso_files/figure-html/unnamed-chunk-32-1.png" width="360" style="display: block; margin: auto;" /> --- # ggplot2 -- - Además de poder realizar la mayoría de los gráficos usando las funciones base de R, existen diferentes librerías gráficas que permiten llevar más allá la calidad de las figuras. -- - Una de las más conocidas es *ggplot2*[[Más información](https://ggplot2.tidyverse.org/)], que se carga en nuestro entorno de trabajo al cargar *tidyverse* -- - Un código base ejemplo consiste en: + Indicar la tabla (data frame) -> *data = mtcars* + Indicar qué graficaremos, lo normal es indicar un *x* e *y* -> *aes(x = mpg,y = wt)* ```r ## basic plot ##usando datos propios de R ggplot(data = mtcars, aes(x = mpg,y = wt)) ``` <img src="data:image/png;base64,#01_Repaso_files/figure-html/unnamed-chunk-33-1.png" width="288" style="display: block; margin: auto;" /> -- - Esto solo crea el crea un lienzo para disponer del gráfico -- - Además debemos indicar como queremos que la información se visualice (líneas, puntos, etc.) --- -- - *Importante*: veremos muchas más alternativas más adelante, pero un buen lugar para indagar es el siguiente [sitio](https://www.r-graph-gallery.com/) ```r ## basic plot ##usando datos propios de R ggplot(data = mtcars, aes(x = mpg,y = wt)) + geom_point() ``` <img src="data:image/png;base64,#01_Repaso_files/figure-html/unnamed-chunk-34-1.png" width="360" style="display: block; margin: auto;" /> --- #Series de tiempo ```r ts.data <- read.csv('Iquique_TS.csv') ```
--- class: middle ```r ggplot(data = ts.data,aes(x=as.Date(fechas),y=sst)) + geom_line(lwd=0.5) + xlab('') + ylab('SST (°C)') + theme_bw() ``` <img src="data:image/png;base64,#01_Repaso_files/figure-html/unnamed-chunk-37-1.png" width="1080" style="display: block; margin: auto;" /> --- Más manipulación de datos -- ```r #leyendo archivo ingresos <- read_excel('Ingresos.xls') summary(ingresos) ``` ``` ## Id region comuna ing_familiar ## Min. : 1 Length:405 Length:405 Min. :0.0000 ## 1st Qu.:102 Class :character Class :character 1st Qu.:0.3997 ## Median :203 Mode :character Mode :character Median :0.7394 ## Mean :203 Mean :1.0675 ## 3rd Qu.:304 3rd Qu.:1.3249 ## Max. :405 Max. :9.5748 ## ing_prom_persona nivel_edu ## Min. :0.0000 Length:405 ## 1st Qu.:0.1704 Class :character ## Median :0.2844 Mode :character ## Mean :0.4168 ## 3rd Qu.:0.4561 ## Max. :3.5485 ``` --- ```r #Filtremos datos #creando cuartiles q <- ingresos$ing_familiar %>% quantile(prob = seq(0, 1, length = 11)) %>% as.vector() #filtrando los más ricos mas_ricos <- ingresos %>% filter(ing_familiar >= q[10]) %>% mutate(descripcion = '10% más rico') #filtrando al resto ni_tan_ricos <- ingresos %>% filter(ing_familiar < q[10]) %>% mutate(descripcion = '90% de la población') ``` -- ```r #peguemos los datos plot.data <- list(mas_ricos, ni_tan_ricos) %>% reduce(bind_rows) ``` --- class: middle ```r #grafiquemos ggplot(data = plot.data,aes(x=comuna, fill=descripcion)) + geom_bar(position = 'dodge') + scale_fill_viridis_d() + xlab ('') + ylab('Número de manzanas censales') + theme_bw() ``` <img src="data:image/png;base64,#01_Repaso_files/figure-html/unnamed-chunk-41-1.png" width="504" style="display: block; margin: auto;" /> --- # Expandiendo las posibilidades -- .center[ [](https://r4ds.had.co.nz/) ] -- - Proporciona una buena base de la dinámica de trabajo con datos en R, siguiendo la filosofía de *tidyverse* para la lectura, manipulación, análisis y comunicación de información. --- -- .center[ [](https://r-graphics.org/) ] - Dispone de muchas ideas para visualización y composición de gráficas en R, abordando diferentes problemáticas y soluciones para las mismas. --- class: inverse,center, middle # ¿PREGUNTAS? --- class: inverse,center, middle # PRÓXIMA SEMANA REPASO GEODATOS!